CGI

صفحات وب اطلاعات متفاوتی را در خود نگهداری می نمايند. صفحات فوق بر روی سرويس دهندگان وب و بر اساس يک ساختار مشخص ، سازماندهی و ذخيره خواهند شد. کاربران اينترنت با استفاده از مرورگر خود ، درخواست يک صفحه وب را می نمايند ، در خواست مورد نظر پس از ارسال از طريق محيط انتقال در اختيار سرويس دهنده وب قرار خواهد گرفت . سرويس دهنده وب پس از دريافت درخواست کاربران ، عمليات جستجو و يافتن فايل درخواست شده را آغاز می نمايند. در صورتيکه فايل ( صفحه وب ) درخواستی پيدا نگردد ، سرويس دهنده برای برنامه مرورگر کاربر کدی را بمنزله عدم يافتن فايل ارسال و مرورگر پيام مناسبی در رابطه با عدمم يافتن فايل را در اختيار کاربر قرارخواهد داد. در صورتيکه سرويس دهنده فايل درخواستی را پيدا نمايد ، آن را بمنظور نمايش برای مرورگر کاربر ارسال خواهد کرد.
فرآيند فوق ، نحوه برخورد سرويس دهنده وب با فايل های ايستا ( صفحات وب ايستا ) را تشريح می نمايد. صفحات وب ايستا ، قبل از درخواست کاربران توسط مولفين مربوطه ، طراحی و بر اساس ساختار سازماندهی شده بر روی سرويس دهنده وب مستقر خواهند شد. محتويات اين نوع صفحات همواره يکسان بوده و اطلاعات موجود را صرفنظر از زمان ، مکان ، تمايلات درخواست کننده بصورت يکسان نمايش خواهند داد. اکثر سرويس دهندگان امکان استفاده از فايل های پويا را نيز فراهم می آورند. برای ارائه تکنولوژی فوق از امکانات متعددی استفاده می گردد . CGI)Common Gateway Interface) يکی از امکانات موجود در اين زمينه است . امروزه از اينترفيس CGI در موارد متعددی استفاده می گردد :
• يک دفترچه تلفن امکان ارسال اطلاعات کاربران را از طريق يک فرم Html فراهم و پس از ارسال اطلاعات موجود در فرم ، اطلاعات در بانک های اطلاعاتی ذخيره خواهد شد.
• يک فروشگاه online کتاب ، امکان ارسال اطلاعات مربوط به يک گروه از کتاب را قراهم و در ادامه اطلاعات تکميلی در رابطه به هر يک از کتاب های موجود در گروه در اختيار کاربران قرار خواهد گرفت .
• در برنامه های موتور جستجو ، امکان درج کلمات مورد نظر برای جستجو در اختيار کاربران گذاشته خواهد شد ، در ادامه برنامه مورد نظر، آدرس صفحات وب شامل اطلاعات مورد نظر ( جستجو) را در اختيار کاربران قرار خواهد داد.

مکانيزم CGI

مکانيزم نحوه عملکرد CGI در اکثر سرويس دهندگان وب ، يکسان و استاندارد است . در اين راستا فولدری با نام cgi-bin در فهرست ريشه وب سايت مورد نظر ايجاد می گردد. نحوه برخورد سرويس دهنده با فايل هائی که در فولدر فوق قرار می گيرند ، متفاوت خواهد بود. سرويس دهنده در رابطه با فايل های فوق صرفا" عمليات ساده خواندن و ارسال را انجام نخواهد داد. اين نوع فايل ها می بايست اجراء و خروجی بدست آمده در اثر اجرای برنامه، برای مرورگر متقاضی ارسال خواهد گرديد. از زبانهای متعددی برای نوشتن برنامه ها در اين زمينه استفاده می گردد. زبان اسکريپتی PERL يکی از متداولترين گزينه ها برای نوشتن اسکريپت های CGI ، می باشد.
بمنظور نوشتن فايل های CGI ، می توان از زبانهای برنامه نويسی و زبانهای اسکريپت استفاده کرد. زبانهای C و PERL دو گزينه مناسب در اين راستا می باشند. مسئوليت برخورد با اسکريپت های CGI برعهده سرويس دهنده وب است .

اسکريپت های ساده CGI

بمنظور نوشتن اسکريپت های CGI ، لازم است که امکان دستيابی به فولدر cgi-bin و آشنائی با يکی از زبانهای C و يا PERL وجود داشته باشد. در اين بخش به بررسی نحوه ايجاد اسکريپت های CGI توضيح داده می شود .
مثال : صفحه وب زير ، يک پيام ساده را در خروجی ( مرورگر ) نمايش می دهد .

يک صفحه وب ساده

<html>
<body>
<h1>يک صفحه ساده وب</h1>
</body>
</html>


برنامه زير با زبان C نوشته شده و همان خروجی صفحه وب فوق را نمايش خواهد داد. اين برنامه ساده ترين نوع استفاده از CGI برای ايجاد خروجی مورد نظر است .

متن برنامه به زبان C 

#include <stdio.h>

int main()
{
printf("Content-type: text/html\n\n");
printf("<html>\n");
printf("<body>\n");
printf("<h1>يک صفحه ساده وب</h1>\n");
printf("</body>\n");
printf("</html>\n");
return 0;
}

برنامه فوق را در فايلی با نام simplest.c ذخيره و با استفاده از کمپايلر C ، آن را با استفاده از دستور زير ترجمه می نمائيم .
gcc simplest.c -o simplest.cgi
پس از ترجمه برنامه و توليد فايل simplest.cgi ، آن را در فولدر cgi-bin ذخيره تا امکان اجرای آن فراهم گردد. بمنظور اجرای برنامه فوق ، مرورگر خود را فعال و در بخش آدرس آن ، آدرس زير را وارد نمائيد.
http://www.yourcompany.com/cgi-bin/simplest.cgi
پس از تايپ آدرس فوق ، برنامه موجود در فايل simplest.cgi اجراء و خروجی مناسب را نمايش خواهد داد. در برنامه فوق استفاده از دستور زير لازم است . دستور زير اولين خطی است که توسط هر اسکريپت CGI برای مرورگر ارسال می گردد :
printf("Content-type: text/html\n\n");
برنامه فوق را می توان با استفاده از زبان PERL نيز نوشت . در اين راستا لازم است کدهای نوشته شده PERL زير را در تايپ و در فايلی با نام simplest.pl ذخيره نمود.

متن برنامه به زبان Perl 

#! /usr/bin/perl
print "Content-type: text/html\n\n";
print "<html><body><h1>Hello World!";
print "</h1></body></html>\n";


فايل فوق را در فولدر cgi-bin قرار داده و بمنظور اجرای آن ، مرورگر را فعال و در بخش آدرس آن ، آدرس زير را وارد نمائيد :
http://www.yourcompany.com/cgi-bin/simplest.pl
در مثال فوق با نحوه استفاده از اسکريپت های CGI بمنظور ايجاد صفحات وب ايستا آشنا شديم . پس از اجرای برنامه های CGI ، خروجی مورد نظر برای مرورگر ارسال می گردد ( اسکريپت ) .
مهمترين مزيت و جايگاه اسکريپت های CGI ، استفاده از تکنولوژی فوق بمنظور ايجاد محتويات پويا می باشد. هر مرتبه که اسکريپت اجراء می گردد ، خروحی متفاوت خواهد بود . در صورتيکه خروجی در هر مرتبه اجراء يکسان باشد ، می توان از صفحات ايستا در اين خصوص استفاده کرد. برنامه نوشته شده به زبان C زير ، يک محتويات پويای ساده را ايجاد می نمايد .

يک برنامه ساده بمنظور ايجاد محتويات پويا

#include <stdio.h>

int incrementcount()
{
FILE *f;
int i;

  f=fopen("count.txt", "r+");
if (!f)
{
sleep(1);
f=fopen("count.txt", "r+");
if (!f)
return -1;
}

  fscanf(f, "%d", &i);
i++;
fseek(f,0,SEEK_SET);
fprintf(f, "%d", i);
fclose(f);
return i;
}

int main()
{
printf("Content-type: text/html\n\n");
printf("<html>\n");
printf("<body>\n");
printf("<h1>The current count is: ")
printf("%d</h1>\n", incrementcount());
printf("</body>\n");
printf("</html>\n");
return 0;
}


با استفاده از يک اديتور برنامه فوق را تايپ و آن را در فايلی با نام count.c ذخيره و با استفاده از دستور زير آن را کمپايل نمائيد :
gcc count.c -o count.cgi
فايل متنی ساده ای با نام count.txt ايجاد و مقدار صفر را در آن قرار دهيد. فايل های count.cgi و count.txt را در فولدر cgi-bin ذخيره تا امکان اجرای آنها فراهم گردد. بمنظور اجرای برنامه فوق ، مرورگر را فعال و در بخش آدرس آن ، آدرس زير را تايپ نمائيد :
http://www.yourcompany.com/cgi-bin/count.cgi
پس از اجرای برنامه فوق ، يک صفحه ايجاد که در هر مرتبه اجراء ، خروجی "The current count is :X" ، مقدار X در هر بار اجرای اسکريپ تغيير و افزايش خواهد يافت . فايل count.txt شماره جاری را در خود نگهداری و تابع incrementcounr ، تابعی است که مقدار count را پس از هر مرتبه اجراء افزايش و آن را در فايل count.txt ثبت خواهد کرد.

فرم ها : ارسال اطلاعات ورودی

همانگونه که مشاهد گرديد ، سرويس دهنده وب فايل های اجرائی موجود در فولدر cgi-bin را اجراء و پس از توليد خروجی ، برای مرورگر ارسال می گردند. برای ارسال اطلاعات به برنامه های CGI می توان از فرم های Html استفاده کرد. از فرم ها در سايت های متعددی استفاده می گردد. هر صفحه ای که اين امکان را به کاربران خواهد داد که اطلاعاتی را تايپ و ارسال دارند ، از فرم استفاده می نمايد. فرم ها با استفاده از تگ های Html ايجاد و در صفحات وب قرار می گيرند. در تگ های Html مربوط به فرم ، نام اسکريپت CGI که مسئول برخورد با فرم پس از تکميل و فشردن دکمه Submit است ، مشخص خواهد شد. اطلاعاتی که توسط کاربر در فرم درج می گردنند ، پس از ارسال فرم در اختيار اسکريپت مورد نظر گذاشته شده و امکان استفاده و عمليات مورد نظر بر روی اطلاعات فراهم خواهد شد.
مثال : دستورات زير يک صفحه Html بهمراه يک فرم را نشان می دهد. دستورات فوق با استفاده از يک اديتور متنی تايپ و در فايلی با نام simpleform.htm ذخيره می گردند.

 

يک صفحه وب و  يک فرم

<html>
<body>
<h1>A super-simple form<h1>
<FORM METHOD=GET ACTION="http://www.yourcompany.com/
cgi-bin/simpleform.cgi">
Enter Your Name:
<input name="Name" size=20 maxlength=50>
<P>
<INPUT TYPE=submit value="Submit">
<INPUT TYPE=reset value="Reset">
</FORM>
</body>
</html>


همانگونه که مشاهده می گردد ، کدهای Html فوق يک فرم ساده شامل يک فيلد برای ورود نام را تعريف و برای ارسال اطلاعات به اسکريپت CGI از متد GET استفاده شده است . فرم فوق دارای دو دکمه submit و Reset برای ارسال اطلاعات و يا reset نمودن فرم است .
فايل simpleform.cgi ، که توسط فرم استفاده خواهد شد ، يک برنامه نوشته شده به زبان C است . برنامه فوق در ابتدا با محتويات زير در فايلی با نام simpleform.c ايجاد شده است .

 پردازش اطلاعات فرم ارسالی

#include <stdio.h>
#include <stdlib.h>

int main()
{
printf("Content-type: text/html\n\n");
printf("<html>\n");
printf("<body>\n");
printf("<h1>The value entered was: ")
printf("%s</h1>\n", getenv("QUERY_STRING"));
printf("</body>\n");
printf("</html>\n");
return 0;
}

برنامه فوق پس از تايپ در يک اديتور متنی در فايلی با نام simpleform.c ذخيره و بصورت زير کمپايل خواهد شد.
gcc simpleform.c -o simpleform.cgi
پس از ترجمه برنامه فوق ، آن را در فولدر cgi-bin ذخيره می گردد. برنامه فوق اطلاعات ارسالی توسط فرم را دريافت ( انتخاب ) ، و آنها را نمايش خواهد داد. مثلا" پس از اجرای برنامه فوق خروجی مطابق زير نمايش داده خواهد شد:
The value entered was: Name=Ali+Rahmani
Name ، نا فيلد ورودی در فرم است . هر فيلد ورودی در يک فرم می بايست دارای يک مشحصه منحصر بفرد باشد. Ali+Rahmani ، نام وارد شده در فرم است. علامت + نشاندهنده فضای خالی است .
استفاده از فرم ها بمنظور اخذ اطلاعات کاربران و ارسال آنها برای يک اسکريپت CGI عمليات ساده ای است . در اين زمينه ، پيشنهادات زير توصيه می گردد :
• هر يک از فيلدهای ورودی موجود در فرم، می بايست دارای يک مشخصه منحصربفرد باشند.
• برای ارسال فرم می بايست متد ارسال را مشخص نمود. در اين راستا دو گزينه GET و POST وجود دارد. متد GET دارای اين مزيت عمده است که می توان مقادير وارد شده را بهمراه URL برای اسکريپت مشاهده و اشکال زدائی آن راحت تر است . ( ويژگی فوق صرفا" از بعد اشکال زدائی مورد نظر است )
• تعداد کاراکترهای ارسالی توسط متد GET محدوده بوده و معمولا" از آن برای ارسال اطلاعات با حجم کم استفاده می شود. متد POST برای فرم هائی که دارای اطلاعات زياد برای ارسال می باشند ، ترجيح داده می شود.
• اطلاعات ارسال شده با استفاده از متد GET با استفاده از متغير محيطی QUERY_STRING قابل دستيابی و استفاده می باشند. ( مقدار متغير فوق در زبان C با استفاده از تابع getenv و در PERL با استفاده از ENV$ قابل دستيابی خواهند بود). اطلاعات ارسال شده توسط متد POST را در زبان C با استفاده از تابع gets و در PERL از read استفاده می گردد.
• اطلاعات ارسالی شامل مقادير مربوط به تمام فيلدهای موجود بر روی فرم بوده که بصورت يک رشته در کنار يکديگر قرار گرفته اند. در اين زمينه ممکن است کاراکترهای فراوانی همراه فرم ارسال و نيازمند ترجمه باشند. مثلا" تمام فضا های خالی با علامت + جايگزين می گردند.
متغير محيطی QUERY_STRING يکی از نمونه های متنوع متغير های محيطی است . در اين زمينه متغيرهای محيطی بيشتری وجود داشته که می توان از آنها بهمراه اسکريپت های CGI استفاده کرد.

متغيرهای محيطی

  • AUTH_TYPE
  • CONTENT_LENGTH
  • CONTENT_TYPE
  • GATEWAY_INTERFACE
  • HTTP_ACCEPT
  • HTTP_USER_AGENT
  • PATH_INFO
  • PATH_TRANSLATED
  • QUERY_STRING
  • REMOTE_ADDR
  • REMOTE_HOST
  • REMOTE_IDENT
  • REMOTE_USER
  • REQUEST_METHOD
  • SCRIPT_NAME
  • SERVER_NAME
  • SERVER_PORT
  • SERVER_PROTOCOL
  • SERVER_SOFTWARE
هر يک از متغيرهای محيطی فوق ، در بردارنده اطلاعات مفيد و جالبی می باشند. مثلا" با استفاده از متغير محيطی REMOTE_USER می توان از آدرس های IP کاربران آگاهی يافت .

ايجاد يک فرم واقعی

در يک فرم واقعی ممکن است از چندين نوع فيلد ورود اطلاعات استفاده گردد . کنترل های استاندارد بر روی يک فرم عبارتند از :
  • Single-line text input
  • Multi-line text input
  • Selection lists
  • Check boxes
  • Radio buttons
  • Specialized buttons
با ترکيب و استفاده از کنترل های فوق ، می توان فرم های جالبی را ايجاد کرد. در ادامه به بررسی هر يک از کنترل های فوق اشاره خواهد شد.
• Single-line edit : واژه " Input" ، يک محدوده قابل ويرايش يک خطی برای ورود اطلاعات را تعريف می نمايد. برای انتساب يک نام منحصر بفرد به فيلد فوق از واژه "Name" استفاده می گردد. هر يک از کنترل های موجود بر روی فرم می بايست دارای يک نام منحصر بفرد باشند. بمنظور تعيين اندازه ( طول ) فيلد بر حسب کاراکتر از واژه "Size" استفاده می گردد. از واژه "Maxlength" برای مشخص نمودن حداکثر کاراکتر ورودی در فيلد مربوطه استفاده می گردد. در صورتيکه فيلد فوق می بايست دارای يک مقدار اوليه در زمان نمايش بر روی فرم باشد از واژه "Value" استفاده و مقدار اوليه فيلد مورد نظر را مشخص می نمائيم . در فيلد فوق بصورت پيش فرض text وارد می گردد. در صورتيکه لازم است که صرفا" در فيلد فوق مقادير عددی صحيح وارد شود ، می بايست نوع اطلاعات وارد شده در فيلد را با صراحت مشخص کرد . در اين زمينه از واژه type=int استفاده می گردد.

يک فيلد کنترلی Single-line

Enter Name: <input name="Name" size=30 maxlength=50 value="Sample">

عملکرد کنترل فوق مشابه کنترل Single-line است . برای کنترل يک نام تعريف و اندازه آن برحسب تعداد سطر و ستون مشخص گردد. هر متنی که قبل از تگ <textarea/> استفاده شود بعنوان مقدار پيش فرض برای کنترل در نظر گرفته خواهد شد. • Check box : نوع خاصی از يک محدوده ورود اطلاعات بوده که برای آن يک مقدار تعيين می گردد. در صورتيکه فيلد فوق توسط کاربر انتخاب گردد ، مقدار در نظر گرفته ، برگردانده خواهد شد.

يک فيلد کنترلی Multi-Line

<textarea name="Company Address" cols=30  rows=4></textarea>

نوع خاصی از يک محدوده ورود اطلاعات بوده که برای آن يک مقدار تعيين می گردد. در صورتيکه فيلد فوق توسط کاربر انتخاب گردد ، مقدار در نظر گرفته ، برگردانده خواهد شد.

يک فيلد کنترلی Checkbox

<input type=checkbox name="Include" value=1>

کنترل های فوق مشابه Check box بوده ولی در گروه هائی سازماندهی می گردند. تمام Radio button های موجود در يک گروه می بايست دارای يک نام مشابه بوده و در صورتيکه لازم است برای آنها مقدار اوليه ای را تغريف کرد از واژه "CHECKED" استفاده می گردد.

يک فيلد کنترلی Radiobuttons

Choose your item:<br>
<input type=radio CHECKED name=one value=ONE>
<input type=radio name=two  value=TWO>
<input type=radio name=three  value=THREE>
<input type=radio name=four value=FOUR>

ليست های انتخابی ، امکان انتخاب يک گزينه از ميان مجموعه ای گزينه های را برای کاربر فراهم می نمايد. با استفاده از وازه " Size" طول فيلد مشخص و با استفاده از واژه "Name" ، برای کنترل يک نام منحصر بفرد تعريف می گردد.
• دکمه های خاص : تگ های زير دو دکمه خاص را تعريف می کند. دکمه Submit اطلاعات موجود در فرم را برای سرويس دهنده ارسال و دکمه Reset برای Reset نمودن فرم استفاده می گردد.

فيلدهای کنترلی خاص

<INPUT TYPE=submit value="Submit">
<INPUT TYPE=reset    value="Reset">


يک فرم واقعی

فرم زير اطلاعات متعددی شامل : نام ، جنسيت ، سن و توضيحات را از کاربران اخذ و آنها را برای پردازش در اختيار يک اسکريپت CGI قرار خواهد داد. فرم فوق در يک صفحه html با نام Testform.htm ذخيره خواهد گرديد.

 

يک فرم کامل

<html>
<body>
<h1>Test Form <h1>
<FORM METHOD=POST ACTION="http://www.yourcompany.com/cgi-bin/testform.cgi">
Enter Your Name:
<input name="Name" size=20 maxlength=50>
<P>Enter your sex:
<input type=radio CHECKED name=sex value=MALE>Male
<input type=radio name=sex value=FEMALE>Female
<P>Select your age<br>
<SELECT size=2 NAME=age>
<OPTION> 1-10
<OPTION> 11-20
<OPTION> 21-30
<OPTION> 31-40
<OPTION> 41-50
<OPTION> 51-60
<OPTION> 61 and up
</SELECT>
<P>Enter Your Comment:
<input name="Name" size=40 maxlength=100>
<P>
<INPUT TYPE=submit value="Submit">
<INPUT TYPE=reset value="Reset">
</FORM>
</body>
</html>

اسکريپت CGI ، چهار فيلد اطلاعاتی موجود در فرم را اخذ و پردازش های لازم را انجام خواهد داد.

خلاصه

• يک اسکريپت CGI برنامه ای است که عموما" با استفاده از زبانهای C و يا PERL نوشته می گردند.
• در اکثر سرويس دهندگان ، اسکريپت های CGI در فولدر cgi-bin قرار می گيرند.
• اسکريپت های CGI موجود در فولدر cgi-bin در زمان درخواست کاربر ، اجراء خواهند شد.
• تمام اطلاعات ارسالی توسط اسکريپت ها به STDOUT برای مرورگر ارسال خواهند شد.
• رشته "Content-type:text/html\n\n" می بايست اولين خط ارسالی برای مرورگر باشد.
• بمنظور ارسال اطلاعات ورودی از فرم های html استفاده و با استفاده از ACTION آدرس اسکريپت پاسخگو مشخص می گردد.
• پس از دريافت اطلاعات فرم ها توسط يک اسکريپت ، می بايست عمليات پالايش اطلاعات ( حذف کاراکترهای غير ضروری ) انجام گيرد.
در صورت طراحی و پياده سازی يک سايت واقعی و پويا ، استفاده از اينترفيس CGI يکی از گزينه های مناسب در اين زمينه خواهد بود .